package com.liming.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.liming.common.pojo.dto.order.admin.OrderPageQuery;
import com.liming.common.pojo.dto.order.user.UserOrderDTO;
import com.liming.common.pojo.dto.order.user.mini.MiniOrderQueryPage;
import com.liming.common.pojo.entity.order.Order;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.dashboard.feign.FeignUserConsumeRankVO;
import com.liming.common.pojo.vo.order.OrderVO;
import com.liming.common.pojo.vo.order.mini.MiniOrderVO;
import com.liming.common.pojo.vo.order.openfeign.FeignOrderDetailVO;
import com.liming.service.wx.pojo.vo.PrepayVO;

import java.util.List;
import java.util.Map;

/**
 * @author liming
 * @date 2025/2/5
 */
public interface OrderMircoService extends IService<Order> {

    /**
     * 用户下单
     *
     * @param userOrderDTO 用户下单参数
     * @return 是否下单成功
     */
    PrepayVO createOrder(UserOrderDTO userOrderDTO);

    /**
     * 根据ID查询订单
     *
     * @param id 订单ID
     * @return 订单信息
     */
    OrderVO detailById(Long id);

    /**
     * 获取待处理订单数量
     *
     * @return 待处理订单数量
     */
    Long undeliveredOrderCount();

    /**
     * 分页 - 订单
     *
     * @param query 查询参数
     * @return 分页 - 订单
     */
    PageVO<OrderVO> pageOrder(OrderPageQuery query);

    /**
     * 订单详情
     *
     * @param id 订单ID
     * @return 订单详情
     */
    FeignOrderDetailVO orderItemById(Long id);

    /**
     * 完成订单
     *
     * @param id 订单ID
     * @return 是否完成订单
     */
    Boolean complete(Long id);

    /**
     * 取消订单
     *
     * @param id 订单ID
     * @return 是否取消订单
     */
    Boolean cancel(Long id);

    /**
     * 用户消费排行
     *
     * @param userIdAndNickname 用户ID、nickname
     * @return 用户消费排序
     */
    List<FeignUserConsumeRankVO> userConsumeRank(Map<Long, String> userIdAndNickname);

    /**
     * 获取所有订单状态数量 根据用户
     *
     * @return 所有订单状态数量
     */
    Map<Integer, Integer> allStatusCount(Long userId);

    /**
     * 获取用户的订单
     *
     * @param queryPage 订单查询参数
     * @return 订单分页
     */
    PageVO<MiniOrderVO> miniPage(MiniOrderQueryPage queryPage);

    /**
     * 根据订单ID列表获取订单的商品ID列表
     *
     * @param keyIdList 订单ID列表
     * @return 商品ID列表
     */
    List<Long> productIdListByOrderIdList(List<Long> keyIdList);

    /**
     * 修改订单状态为 发货|自提 根据订单是否自提状态来判断
     *
     * @param id 订单ID
     * @return 订单发货或自提 结果
     */
    Boolean deliverOrPickup(Long id);

    /**
     * 订单支付成功 调用（回调）接口
     *
     * @param id 订单ID
     * @return 内部操作是否成功
     */
    Boolean createOrderPaySuccess(Long id);

    /**
     * 订单退款成功 后续逻辑
     *
     * @param orderId 订单ID
     */
    void refundSuccess(Long orderId);
}
